// nodejs是一个事件驱动的
// 使用nodejs内置的http模块完成 web服务器 tcp
const http = require('http')
const path = require('path')
const fs = require('fs')
// 得到一个webserver对象
const server = http.createServer();

// 定义好对应的mime类型
let mimeTypes = require('./libs/mime')

// 定义网站根目录  相对转为绝对   浏览器中访问的 / => 磁盘中的此路径
const webRoot = path.resolve('public')

// 监听客户发送过来的请求
server.on('request', (req, res) => {
  // 获取当前请求的url地址
  // 缺省值处理
  let pathname = req.url == '/' ? '/index.html' : req.url

  // 对于ico请求不做任何处理
  if (pathname != '/favicon.ico') {
    // 请求的url地址和本机服务器中存在的文件进行映射, 得到访问文件路径(绝对路径)
    var filepath = path.join(webRoot, pathname)

    // 得到路径中的扩展名
    let extname = path.extname(filepath).slice(1)
    // 短语运算
    let mime = mimeTypes[extname] || 'text/html;charset=utf-8'

    // 判断当前文件是否存在
    if (fs.existsSync(filepath)) {
      // 设置响应头中的mime类型
      res.setHeader('content-type', mime)
      // 读取磁盘中存在的文件，显示
      res.end(fs.readFileSync(filepath))
    } else {
      var filepath = path.join(webRoot, '/404.html')
      // 设置响应头中的mime类型
      res.setHeader('content-type', mime)
      res.statusCode = 404
      // 响应体
      res.end(fs.readFileSync(filepath))
    }
  }
});

// 绑定主机和端口
// 参数1：绑定的端口号
// 参数2：可选，绑定服务器中的网卡 127.0.0.1只能本机访问 0.0.0.0绑定本机中所有的网卡,如果不写以ipv6的方式让所有的网卡绑定上，缺点获取的ip地址，将不对
server.listen(3000, '127.0.0.1', () => console.log('服务器启动'))


